package models

import (
	"Dissertation/utils"
	"encoding/json"
	"time"

	"github.com/gin-gonic/gin"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"gorm.io/gorm/logger"
)

// 定义一个数据表结构体
type User struct {
	gorm.Model //gin专用包,里面有：
	//ID，create_Time,update_TIme,delect_Time(都是自动添加的修改的)
	Number string `json:"number" gorm:"unique_index"`
	Name   string `json:"name"`  //名字
	Class  string `json:"class"` //班级
	Sex    string `json:"sex"`   //年龄

}

var DB *gorm.DB

// 定义一个初始化User结构体的方法
// 这样使用起来更加方便
func InvokeUser() *User {
	return &User{}
}

// 定义一个方法程序开始时，
// 初始化数据并且连接数据库拿到数据存放在redis中
func InitializeMYSQL() (err error) {
	DB, err = gorm.Open(mysql.Open(utils.Mysqldns), &gorm.Config{
		//设置日志输出条件
		Logger: logger.Default.LogMode(logger.Info),
	})

	if err != nil {
		return err
	}
	//拿到底层的MySQL连接池DB
	sqldb, err := DB.DB()
	if err != nil {
		return err
	}
	//测试是否连接上数据库
	err = sqldb.Ping()
	if err != nil {
		return err
	}
	//连接上了设置连接池的设置(默认的设置就可以应用于平常的需求)
	//设置连接池的数量时间等
	sqldb.SetMaxOpenConns(10)
	sqldb.SetMaxIdleConns(10)
	sqldb.SetConnMaxIdleTime(time.Hour)
	sqldb.SetConnMaxLifetime(time.Hour)

	//设置好后顺便创建一个数据表
	DB.AutoMigrate(&User{})
	return
}

// 将文件读取的值的数据存入到数据库中
func MYSQL_ExtractData(number, name, ip string) (err error) {
	user := &User{
		Name:   name,
		Number: number,
		Class:  "云计算技术应用2班",
	}
	//将新的数据存入数据中
	err = DB.Create(user).Error
	if err != nil {
		return err
	}
	return
}

func FIndNumber(number string) (error, []User) {
	user := []User{}
	err := DB.Model(&User{}).Where("number=?", number).Find(&user).Error
	return err, user
}

// 根据姓名查询
func FIndName(name string) (error, []User) {
	user := []User{}
	err := DB.Model(&User{}).Where("name=?", name).Find(&user).Error
	return err, user
}

// 根据性别查询
func FIndSex(sex string) (error, []User) {
	user := []User{}
	err := DB.Model(&User{}).Where("sex=?", sex).Find(&user).Error
	return err, user
}

// 根据班级查询
func FIndClass(class string) (error, []User) {
	user := []User{}
	err := DB.Model(&User{}).Where("class=?", class).Find(&user).Error

	return err, user
}

//查询所有数据
func FindAll()(error, []User)  {
	user := []User{}
	err := DB.Model(&User{}).Find(&user).Error

	return err, user
}
func SendMessage(err error, this *gin.Context, user []User) {
	if err != nil {
		this.String(500, err.Error())
	} else {
		msg, err := json.Marshal(user)
		if err != nil {
			this.String(500, err.Error())
		}
		this.String(200, string(msg))
	}
}

func Update(user User, number string) error {
	_, raw := FIndNumber(number)
	if user.Name == "" {
		user.Name = raw[0].Name
	}
	if user.Sex == "" {
		user.Sex = raw[0].Sex
	}
	if user.Class == "" {
		user.Class = raw[0].Class
	}
	err := DB.Model(&User{}).Where("number=?", number).Updates(User{
		Name:  user.Name,
		Sex:   user.Sex,
		Class: user.Class,
	}).Error
	return err
}

func Delete(Type string, data string) error {
	raw := "id=?"
	if (Type=="1") {
		raw = "number=?"
	}else if (Type == "2") {
		raw = "name=?"
	} else if (Type == "3") {
		raw = "sex=?"
	} else if (Type == "4") {
		raw = "class=?"
	}
	err := DB.Where(raw, data).Delete(&User{}).Error
	return err
}
func Add(user User)error  {
	err:=DB.Create(&user).Error
	return err
}
